﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using Web.CrmContacto.Code;
using Web.CrmContacto.Code.Security;
using CrmContacto.Contracts;
using CrmContacto.Contracts.Enums;
using Web.Framework;
using CrmContacto.Contracts.Contracts;
using Web.Framework.Translate;
using Web.Framework.Controls;
using CrmContacto.WebApp.Code.InnerClasses.FrontEnd;
using CrmContacto.Contracts.Contracts.Search;
using CrmContacto.WebApp.Code.InnerClasses;
using Web.Framework.Misc;
using System.Configuration;
using Web.Framework.Helpers;
using System.IO;

namespace CrmContacto.WebApp.App
{
    public partial class CustomerEdit : BasePage
    {
        private Cliente currentCliente
        {
            get
            {
                return (Cliente)(ViewState["currentCliente"]);
            }
            set
            {
                ViewState["currentCliente"] = value;
            }
        }

        public MiscClass.ClienteEditTab currentTab
        {
            get
            {
                if (ViewState["currentTab"] == null)
                {
                    ViewState["currentTab"] = MiscClass.ClienteEditTab.InfoBasica;
                }

                return (MiscClass.ClienteEditTab)(ViewState["currentTab"]);
            }
            set
            {
                ViewState["currentTab"] = value;
            }
        }

        public bool DisableVentas { get; set; }

        public bool DisableBitacora { get; set; }

        public string disabledTabs
        {
            get
            {
                string disabledTabsStr = string.Empty;
                if (currentCliente != null && currentCliente.Id == 0)
                {
                    disabledTabsStr = "[1,2,3]";
                }
                else
                {
                    if (DisableVentas && DisableBitacora)
                    {
                        disabledTabsStr = "[1,3]"; // Compras y bitacora
                    }
                    else if(DisableVentas)
                    {
                        disabledTabsStr = "[1]"; // Compras
                    }
                    else if (DisableBitacora)
                    {
                        disabledTabsStr = "[1, 3]"; // Bitacora
                    }
                    else
                    {
                        disabledTabsStr = "[]";
                    }
                }

                return disabledTabsStr;
            }
        }

        private CustomerSearchParam CustomerSearchParamSession
        {
            get
            {
                return (CustomerSearchParam)StoreHelper.GetObject(MiscClass.CustomerSearchParamCacheKey);
            }
            set
            {
                StoreHelper.StoreObject(MiscClass.CustomerSearchParamCacheKey, value);
            }
        }

        private List<LinkButton> actionButtons = new List<LinkButton>();
        LinkButton eliminarButton = new LinkButton();
        LinkButton guardarButton = new LinkButton();
        LinkButton agregarListaDeDistribucionButton = new LinkButton();
        LinkButton activarInactivarButton = new LinkButton();
        protected override void OnInit(EventArgs e)
        {
            base.OnInit(e);
            guardarButton.ID = "BoCommandGuardar";
            guardarButton.Text = LocalizationProvider.Instance["Bo.Command.Guardar"];
            guardarButton.Click += new EventHandler(lnkGuardar_Click);
            guardarButton.OnClientClick = "return window.CustomerEditObj.ValidateGuardar();";
            actionButtons.Add(guardarButton);

            agregarListaDeDistribucionButton.ID = "BoEditContactoAgregarAListaDeDistribucion";
            agregarListaDeDistribucionButton.CausesValidation = false;
            agregarListaDeDistribucionButton.Text = LocalizationProvider.Instance["Bo.EditContacto.AgregarAListaDeDistribucion"];
            SetJavascriptForClientClickDirtyChech(agregarListaDeDistribucionButton);
            agregarListaDeDistribucionButton.Click += new EventHandler(agregarListaDeDistribucionButton_Click);
            actionButtons.Add(agregarListaDeDistribucionButton);

            activarInactivarButton.ID = "BoCommandActivar";
            activarInactivarButton.CausesValidation = false;
            SetJavascriptForClientClickDirtyChech(activarInactivarButton);
            activarInactivarButton.Click += new EventHandler(ActivarInactivarButton_Click);
            actionButtons.Add(activarInactivarButton);

            eliminarButton.ID = "BoCommandEliminar";
            eliminarButton.CausesValidation = false;
            eliminarButton.Text = LocalizationProvider.Instance["Bo.Command.Eliminar"];
            eliminarButton.Click += new EventHandler(eliminarButton_Click);
            actionButtons.Add(eliminarButton);

            base.LoadContextActions(actionButtons);
        }

        private void eliminarButton_Click(object sender, EventArgs e)
        {
            try
            {
                WebServiceHelper.EliminarContactos(new CustomerSearchParam() { Ids = new List<int>() { currentCliente.Id }, EmpresaId = BasePage.CompanyId });
                //NuevoCliente();
                //Bind();
                //this.masterPage.ShowMessage(LocalizationProvider.Instance["Bo.Message.RegistroEliminado"], WebMessageType.Notification);
                Response.Redirect(Request.Url.Scheme + "://" + Request.Url.Authority + MiscClass.UrlCustomerSearch + string.Format("?{0}=1&search=1", MiscClass.QueryShowDeleted), true);
            }
            catch (Exception ex)
            {
                ExceptionManager.Instance.HandleException(ex);
            }
        }

        private void ActivarInactivarButton_Click(object sender, EventArgs e)
        {
            try
            {
                if (currentCliente.Id != 0 && currentCliente.Estado.HasValue)
                {
                    EstadoCliente estado = (EstadoCliente)currentCliente.Estado;
                    currentCliente.Estado = (int)(estado == EstadoCliente.Activo ? EstadoCliente.Inactivo : EstadoCliente.Activo);
                    WebServiceHelper.ActivarEntidad(currentCliente.GetType().Name, currentCliente.Estado, currentCliente.Id);
                    var tmpCurrentCliente = WebServiceHelper.GetCustomerById(WebServiceHelper.ServiceOptionsDefault, currentCliente.Id, new ClienteByIdOptions() { LoadBasicInfo = false, LoadSales = false, LoadBitacora = true, LoadListasDeDistribucion = false });
                    currentCliente.Bitacora.Clear();
                    currentCliente.Bitacora.AddRange(tmpCurrentCliente.Bitacora);
                    Bind();
                }
            }
            catch (Exception ex)
            {
                ExceptionManager.Instance.HandleException(ex);
            }
        }

        private void agregarListaDeDistribucionButton_Click(object sender, EventArgs e)
        {
            try
            {
                if (currentCliente.Id != 0)
                {
                    base.NavigationContext.AgregandoListasDeDistribucionAContacto = true;
                    base.NavigationContext.ContactoId = currentCliente.Id;
                    SetThisPageToGoBack();
                    base.NavigationContext.UrlToGoBack += string.Format("&tabName={0}", (byte)MiscClass.ClienteEditTab.ListaDistribucion);
                    Response.Redirect(Request.Url.Scheme + "://" + Request.Url.Authority + MiscClass.UrlListaDeDistribucionList, true);
                }
            }
            catch (Exception ex)
            {
                ExceptionManager.Instance.HandleException(ex);
            }
        }

        private void SetThisPageToGoBack()
        {
            if (currentCliente.Id != 0)
            {
                base.NavigationContext.UrlToGoBack = Request.Url.Scheme + "://" + Request.Url.Authority + MiscClass.UrlCustomerEdit + string.Format("?Id={0}", currentCliente.Id);
            }
        }

        private void agregarBitacoraButton_Click(object sender, EventArgs e)
        {
            try
            {
                if (currentCliente.Id != 0)
                {
                    Response.Redirect(Request.Url.Scheme + "://" + Request.Url.Authority + MiscClass.UrlCustomerBitacora + string.Format("?ContactoId={0}", currentCliente.Id), true);
                }
            }
            catch (Exception ex)
            {
                ExceptionManager.Instance.HandleException(ex);
            }
        }

        protected void Page_Load(object sender, EventArgs e)
        {
            try
            {
                if (!this.IsPostBack)
                {
                    if (this.Request.QueryString["Id"] != null)
                    {
                        HasPermissionToSeeMe(CrmSecurity.CUSTOMER_EDIT, CrmSecurity.CUSTOMERSEARCH_VIEW);
                        int customerId = Convert.ToInt32(this.Request.QueryString["Id"]);
                        currentCliente = WebServiceHelper.GetCustomerById(WebServiceHelper.ServiceOptionsDefault, customerId, new ClienteByIdOptions() { LoadBasicInfo = true, LoadSales = true, LoadBitacora = true, LoadListasDeDistribucion = true });
                    }
                    else
                    {
                        HasPermissionToSeeMe(CrmSecurity.CUSTOMER_CREATE);
                        NuevoCliente();
                    }

                    if (this.Request.QueryString["tabName"] != null)
                    {
                        currentTab = ((MiscClass.ClienteEditTab)Convert.ToByte(this.Request.QueryString["tabName"]));
                    }
                    else
                    {
                        currentTab = MiscClass.ClienteEditTab.InfoBasica;
                    }

                    this.hidSelectedTab.Value = ((int)currentTab).ToString();

                    if (this.Request.QueryString["addingListaDistribucionOk"] != null)
                    {
                        this.masterPage.ShowMessage(LocalizationProvider.Instance["Bo.Messages.ContactoAgregadoALista"], WebMessageType.Notification);
                        base.NavigationContext.ContactoId = null;
                        base.NavigationContext.AgregandoListasDeDistribucionAContacto = false;
                    }

                    if (this.Request.QueryString["addingCategoriasOk"] != null)
                    {
                        base.NavigationContext.AgregandoContactosACategorias = false;
                        if (this.Request.QueryString["addingCategoriasOk"] == "1")
                        {
                            base.NavigationContext.AgregandoContactosACategorias = false;
                            this.masterPage.ShowMessage(LocalizationProvider.Instance["Bo.Messages.ContactoAgregadoACategoria"], WebMessageType.Notification);
                        }
                    }

                    LoadCbos();
                    Bind();
                }

                RegistrarJsConfiguracionEmpresa();

                currentTab = (MiscClass.ClienteEditTab)Convert.ToInt32(this.hidSelectedTab.Value);

            }
            catch (Exception ex)
            {
                ExceptionManager.Instance.HandleException(ex);
            }
        }

        private void RegistrarJsConfiguracionEmpresa()
        {
            var configs = BasePage.GetCompanyConfigurationKeyValue(this, BasePage.CompanyId);

            var config = configs.Where(c => c.Key == CommonConstants.ValidacionMaximoEdad).SingleOrDefault();
            if (config != null)
            {
                ClientScript.RegisterClientScriptBlock(this.GetType(), "companyConfig", "<script> var _maximoEdad = " + config.Value + ";</script>");
            }
        }

        private void NuevoCliente()
        {
            currentCliente = new Cliente();
            currentCliente.EmpresaId = BaseWebPage.CompanyId;
            currentCliente.Estado = (int)EstadoCliente.Activo;
        }

        private void Bind()
        {
            if (currentCliente.TipoDocumentoId.HasValue)
            {
                this.cboTipoDocumento.SelectedValue = currentCliente.TipoDocumentoId.Value.ToString();
            }

            if (currentCliente.Estado.HasValue)
            {
                this.cboEstado.SelectedValue = currentCliente.Estado.Value.ToString();
                EstadoCliente estadoCliente = (EstadoCliente)currentCliente.Estado.Value;
                LinkButton activarInactivarButton = actionButtons.Where(b => b.ID == "BoCommandActivar").Single();
                switch (estadoCliente)
                {
                    case EstadoCliente.Activo:
                        activarInactivarButton.Text = LocalizationProvider.Instance["Bo.Command.Inactivar"];
                        break;
                    case EstadoCliente.Inactivo:
                        activarInactivarButton.Text = LocalizationProvider.Instance["Bo.Command.Activar"];
                        break;
                    default:
                        activarInactivarButton.Visible = false;
                        break;
                }
            }

            if (currentCliente.CantidadHijos.HasValue)
            {
                this.cboCantidadHijos.SelectedValue = currentCliente.CantidadHijos.Value.ToString();
            }

            if (currentCliente.EdadHijoMenor.HasValue)
            {
                this.cboEdadHijoMenor.SelectedValue = currentCliente.EdadHijoMenor.Value.ToString();
            }

            if (currentCliente.Dni.HasValue)
            {
                this.txtDNI.Text = currentCliente.Dni.ToString();
            }

            this.txtEmail.Text = currentCliente.Email;
            this.txtNombre.Text = currentCliente.Nombre;
            this.txtApellido.Text = currentCliente.Apellido;
            this.txtDomicilio.Text = currentCliente.Domicilio;
            this.txtCodigoPostal.Text = currentCliente.CodigoPostal;
            this.txtTelefono.Text = currentCliente.Telefono;
            this.txtCredencial.Text = currentCliente.NroCredencial;
            this.chkDeseaRecibirEmails.Checked = currentCliente.DeseaRecibirEmails;

            if (currentCliente.OrigenPuntoDeVentaId.HasValue)
            {
                this.txtOrigenPuntoDeVenta.Visible = true;
                var puntosDeVenta = this.GetPuntosDeVenta(BasePage.CompanyId);
                var ptoVta = puntosDeVenta.Where(p => p.Id == currentCliente.OrigenPuntoDeVentaId.Value).SingleOrDefault();
                if (ptoVta != null)
                {
                    this.txtOrigenPuntoDeVenta.Text = ptoVta.Nombre;
                }
            }

            if (currentCliente.Id == 0)
            {
                this.cboOrigen.SelectedValue = ((int)TipoContactoOrigen.Backoffice).ToString();
                this.cboOrigen.Enabled = false;

                this.cboEstadoEmail.SelectedValue = ((int)EstadoEmail.Alta).ToString();
                this.cboEstadoEmail.Enabled = false;
            }
            else
            {
                this.cboOrigen.SelectedValue = currentCliente.OrigenId.ToString();
                if (currentCliente.EstadoEmail.HasValue)
                {
                    this.cboEstadoEmail.SelectedValue = currentCliente.EstadoEmail.Value.ToString();
                }

                if (currentCliente.Sexo.HasValue)
                {
                    this.cboSexo.SelectedValue = currentCliente.Sexo.Value.ToString();
                }
            }

            //Selecciono todos los items, ya que solo muestro las del cliente
            foreach (ListItem item in lstCategorias.Items)
            {
                var cat = currentCliente.Categorias.Where(c => c.Id == Convert.ToInt32(item.Value)).SingleOrDefault();
                item.Selected = cat != null;
            }

            if (currentCliente.NacionalidadId.HasValue)
            {
                this.cboPais.SelectedValue = currentCliente.NacionalidadId.Value.ToString();
                LoadComboProvincias();

                if (currentCliente.ProvinciaId.HasValue)
                {
                    this.cboProvincia.SelectedValue = currentCliente.ProvinciaId.Value.ToString();
                }
            }

            if (currentCliente.CumpleDia.HasValue)
            {
                this.cboCumpleDia.SelectedValue = currentCliente.CumpleDia.Value.ToString();
            }
            else
            {
                this.cboCumpleDia.SelectedValue = UIHelper.cboNullValue;
            }

            if (currentCliente.CumpleMes.HasValue)
            {
                this.cboCumpleMes.SelectedValue = currentCliente.CumpleMes.Value.ToString();
            }
            else
            {
                this.cboCumpleMes.SelectedValue = UIHelper.cboNullValue;
            }

            if (currentCliente.CumpleAnio.HasValue)
            {
                this.cboCumpleAnio.SelectedValue = currentCliente.CumpleAnio.Value.ToString();
            }
            else
            {
                this.cboCumpleAnio.SelectedValue = UIHelper.cboNullValue;
            }

            LoadVentasFromContacto(this.GridCtrlVentas, currentCliente);

            BindListaDeDistribucion();

            BindBitacoraToGrid();
        }

        private void BindListaDeDistribucion()
        {
            this.GridListasDistribucion.DataSource = currentCliente.ListasDeDistribucion;
            this.GridListasDistribucion.DataBind();
        }

        private void BindBitacoraToGrid()
        {
            this.GridBitacora.DataSource = currentCliente.Bitacora;
            this.GridBitacora.DataBind();
        }

        private void LoadVentasFromContacto(GridCtrl gridCtrl, Cliente currentCliente)
        {
            List<VentaCabecera> ventasCabeceraList = new List<VentaCabecera>();
            // Tengo que construir las ventas en VentaCabecera
            //currentCliente.Ventas

            // Agrupo "a mano" por número de factura
            ComparerGrupoFactura comparer = new ComparerGrupoFactura();

            var numerosFacturaList = currentCliente.Ventas.Select(f => new GrupoFactura { Prefijo = f.Prefijo, Talonario = f.Talonario, Factura = f.NumeroFactura, Fecha = f.FechaVenta }).ToList();

            List<GrupoFactura> gruposUnicos = new List<GrupoFactura>();
            foreach (var g in numerosFacturaList)
            {
                if (gruposUnicos.Where(gu => comparer.Equals(gu, g)).Count() == 0)
                {
                    gruposUnicos.Add(g);
                }
            }

            gruposUnicos = gruposUnicos.OrderByDescending(f => f.Fecha).ToList();

            foreach (GrupoFactura grupoFactura in gruposUnicos)
            {
                var facturasList = currentCliente.Ventas.Where(v => v.Prefijo == grupoFactura.Prefijo && v.Talonario == grupoFactura.Talonario && v.NumeroFactura == grupoFactura.Factura).ToList();
                var facturaIndividual = facturasList.First();

                VentaCabecera cabecera = new VentaCabecera();

                cabecera.FechaVenta = facturaIndividual.FechaVenta;
                cabecera.Prefijo = facturaIndividual.Prefijo;
                cabecera.Talonario = facturaIndividual.Talonario;
                cabecera.NumeroFactura = facturaIndividual.NumeroFactura;
                cabecera.NroTransaccion = facturaIndividual.NroTransaccion;
                cabecera.MontoTotal = facturasList.Sum(f => f.Monto);
                cabecera.PuntoVenta = facturaIndividual.PuntoVentaName;
                cabecera.SalesMan = facturaIndividual.SalesMan;
                cabecera.Cupon = facturaIndividual.Cupon;
                cabecera.detalleVentas = LoadDetalleDeVentas(facturasList);

                ventasCabeceraList.Add(cabecera);
            }

            // Cargo la metadata en la grilla y bindeo
            gridCtrl.ColumnMetadataCollection = VentaCabecera.ColumnMetadata;
            gridCtrl.DataSource = ventasCabeceraList;
        }

        private List<VentaDetalle> LoadDetalleDeVentas(List<ClienteVenta> facturasList)
        {
            List<VentaDetalle> ventas = new List<VentaDetalle>();

            VentaDetalle item;
            foreach (var factura in facturasList)
            {
                // No agrego las ventas que no son ventas
                if (factura.CodigoProducto.Trim().Length >= 8)
                {
                    item = new VentaDetalle();
                    item.CodigoProducto = factura.CodigoProducto;
                    item.Cantidad = factura.Cantidad;
                    item.Descripcion = factura.Descripcion;
                    item.Monto = factura.Monto;
                    ventas.Add(item);
                }
            }

            return ventas;
        }

        private void SetData()
        {
            currentCliente.TipoDocumentoId = UIHelper.GetIntFromInputCbo(this.cboTipoDocumento);
            if (!string.IsNullOrEmpty(this.txtDNI.Text))
            {
                currentCliente.Dni = Decimal.Parse(this.txtDNI.Text);
            }
            else
            {
                currentCliente.Dni = null;
            }

            currentCliente.Email = this.txtEmail.Text;
            currentCliente.Nombre = this.txtNombre.Text;
            currentCliente.Apellido = this.txtApellido.Text;
            currentCliente.Domicilio = this.txtDomicilio.Text;
            currentCliente.CodigoPostal = this.txtCodigoPostal.Text;
            currentCliente.Telefono = this.txtTelefono.Text;
            currentCliente.NroCredencial = this.txtCredencial.Text;
            currentCliente.EmpresaId = BasePage.CompanyId;
            currentCliente.DeseaRecibirEmails = this.chkDeseaRecibirEmails.Checked;
            currentCliente.Sexo = UIHelper.GetIntFromInputCbo(this.cboSexo);

            //Selecciono todos los items, ya que solo muestro las del cliente            
            foreach (ListItem item in lstCategorias.Items)
            {
                if (item.Selected)
                {
                    currentCliente.Categorias.Add(new MaestroBase() { Id = Convert.ToInt32(item.Value) });
                }
            }

            currentCliente.NacionalidadId = UIHelper.GetIntFromInputCbo(this.cboPais);
            currentCliente.ProvinciaId = UIHelper.GetIntFromInputCbo(this.cboProvincia);

            currentCliente.CumpleDia = (short?)UIHelper.GetIntFromInputCbo(this.cboCumpleDia);
            currentCliente.CumpleMes = (short?)UIHelper.GetIntFromInputCbo(this.cboCumpleMes);
            currentCliente.CumpleAnio = (short?)UIHelper.GetIntFromInputCbo(this.cboCumpleAnio);
            currentCliente.CantidadHijos = UIHelper.GetIntFromInputCbo(cboCantidadHijos);
            currentCliente.EdadHijoMenor = UIHelper.GetIntFromInputCbo(cboEdadHijoMenor);
        }

        private void SaveCustomer()
        {
            SetData();
            // Las listas se las elimino para guardar el cliente
            currentCliente.Bitacora.Clear();
            currentCliente.Ventas.Clear();
            currentCliente.ListasDeDistribucion.Clear();

            currentCliente = WebServiceHelper.SaveCustomer(currentCliente);
        }

        private void LoadCbos()
        {
            int paisId = Convert.ToInt32(ConfigurationManager.AppSettings["paisPorDefecto"]);
            List<MaestroBase> tipoDocumento = WebServiceHelper.GetTipoDocumento(paisId);
            UIHelper.LoadCbo(tipoDocumento, cboTipoDocumento, LocalizationProvider.Instance["DropDown.SinEspecificar"]);

            UIHelper.LoadCboRange(1, 31, this.cboCumpleDia, LocalizationProvider.Instance["DropDown.SinEspecificar"]);
            UIHelper.LoadCboMonth(this.cboCumpleMes, LocalizationProvider.Instance["DropDown.SinEspecificar"]);
            UIHelper.LoadCboRange(1930, 2030, this.cboCumpleAnio, LocalizationProvider.Instance["DropDown.SinEspecificar"]);

            UIHelper.LoadEstados<SexoEnum>(this.cboSexo, LocalizationProvider.Instance["DropDown.SinEspecificar"]);

            List<Pais> pais = this.GetPaises();
            UIHelper.LoadCbo(pais, cboPais, string.Empty);
            cboPais.SelectedValue = paisId.ToString();

            List<MaestroBase> categoriasList = this.GetCategorias(BaseWebPage.CompanyId);
            UIHelper.LoadLst(categoriasList, this.lstCategorias, string.Empty);

            // Estado
            UIHelper.LoadEstados<EstadoEmail>(this.cboEstadoEmail);

            // Estado Email
            UIHelper.LoadEstados<EstadoCliente>(this.cboEstado);

            UIHelper.LoadEstados<TipoContactoOrigen>(this.cboOrigen);

            UIHelper.LoadEstados<ContactoCantidadHijos>(this.cboCantidadHijos, LocalizationProvider.Instance["DropDown.SinEspecificar"]);

            UIHelper.LoadEstados<ContactoEdadHijoMenor>(this.cboEdadHijoMenor, LocalizationProvider.Instance["DropDown.SinEspecificar"]);

            LoadComboProvincias();

            var tipoMensajeBitacoraList = WebServiceHelper.GetTipoMensajeBitacora(new TipoMensajeBitacoraSearch() { EmpresaId = BasePage.CompanyId, EsPdv = false });
            UIHelper.LoadCbo(tipoMensajeBitacoraList, cboTipoMensajeBitacoraId, LocalizationProvider.Instance["DropDown.SinEspecificar"]);

            UIHelper.LoadEstados<TipoRegistroBitacora>(this.cboTipoRegistroBitacora);
            this.cboTipoRegistroBitacora.SelectedValue = ((int)TipoRegistroBitacora.Mensaje).ToString();
            this.cboTipoRegistroBitacora.Enabled = false;
        }

        private void LoadComboProvincias()
        {
            List<MaestroBase> provincias = WebServiceHelper.GetProvincias(Convert.ToInt32(this.cboPais.SelectedValue));
            UIHelper.LoadCbo(provincias, cboProvincia, LocalizationProvider.Instance["DropDown.SinProvincia"]);
        }

        protected override void ApplySecurity()
        {
            base.ApplySecurity();

            if (currentCliente != null && currentCliente.Id != 0)
            {
                HasPermissionToSeeMe(CrmSecurity.CUSTOMER_EDIT, CrmSecurity.CUSTOMERSEARCH_VIEW);
                eliminarButton.Visible = HasPermissionFor(CrmSecurity.CUSTOMER_DELETE);
                SetJavascriptForDeleteRecord(eliminarButton, currentCliente.Email);

                DisableVentas = !HasPermissionFor(CrmSecurity.CUSTOMER_SALES);
                DisableBitacora = !HasPermissionFor(CrmSecurity.CUSTOMER_BITACORA);

                // Si el contacto está inactivo no se puede editar
                if (currentCliente.Estado == (int)EstadoCliente.Inactivo)
                {
                    pnlCustomerControlsForEdition.Enabled = false;
                    pnlCustomerControlsListaDistribucionForEdit.Enabled = false;
                    pnlCustomerControlsBitacoraForEdit.Enabled = false;
                    lnkGuardar.Enabled = false;
                    
                    // Menu contextual
                    agregarListaDeDistribucionButton.Visible = false;
                    guardarButton.Visible = false;
                    eliminarButton.Visible = false;
                    lnkGuardar.Visible = HasPermissionFor(CrmSecurity.CUSTOMER_EDIT);

                    this.GridListasDistribucion.Columns[0].Visible = false;
                    this.GridListasDistribucion.Columns[1].Visible = false;
                }
                else if (currentCliente.Estado == (int)EstadoCliente.Activo || !currentCliente.Estado.HasValue)
                {
                    lnkGuardar.Enabled = true;
                    pnlCustomerControlsForEdition.Enabled = true;
                    pnlCustomerControlsListaDistribucionForEdit.Enabled = true;
                    pnlCustomerControlsBitacoraForEdit.Enabled = true;
                    lnkGuardar.Visible = HasPermissionFor(CrmSecurity.CUSTOMER_EDIT);
                    lnkGuardarBitacora.Visible = HasPermissionFor(CrmSecurity.CUSTOMER_ADD_BITACORA);
                    this.lstCategorias.Enabled = HasPermissionFor(CrmSecurity.CUSTOMER_ADDTO_CATEGORY);
                    if (!lstCategorias.Enabled)
                    {
                        lstCategorias.Attributes.Add("inhabilitar", "si");
                    }
                    // Menu contextual
                    agregarListaDeDistribucionButton.Visible = HasPermissionFor(CrmSecurity.CUSTOMER_ADDTO_DISTRIBUTIONLIST);
                    guardarButton.Visible = HasPermissionFor(CrmSecurity.CUSTOMER_EDIT);
                    eliminarButton.Visible = HasPermissionFor(CrmSecurity.CUSTOMER_DELETE);

                    this.GridListasDistribucion.Columns[0].Visible = HasPermissionFor(CrmSecurity.DISTRIBUTIONLIST_SEARCH) || HasPermissionFor(CrmSecurity.DISTRIBUTIONLIST_MANAGE);
                    this.GridListasDistribucion.Columns[1].Visible = HasPermissionFor(CrmSecurity.CUSTOMER_ADDTO_DISTRIBUTIONLIST);                    
                }               

                activarInactivarButton.Visible = HasPermissionFor(CrmSecurity.CUSTOMER_CHANGE_STATE);
            }
            else
            {
                HasPermissionToSeeMe(CrmSecurity.CUSTOMER_CREATE);
            }

            this.lnkCategoriasIrA.Visible = HasPermissionFor(CrmSecurity.CATEGORY_SEARCH);
            this.lnkIrAPais.Visible = HasPermissionFor(CrmSecurity.COUNTRY_SEARCH);
            this.lnkIrATipoMensaje.Visible = HasPermissionFor(CrmSecurity.BITACORA_MSGTYPE_MANAGE);

            SetJavascriptForToAvoidConfirmLeave(lnkGuardarBitacora);
            lnkGuardarBitacora.Visible = HasPermissionFor(CrmSecurity.CUSTOMER_ADD_BITACORA);
        }

        private void SaveBitacoraRegistry()
        {
            ClienteBitacora clienteBitacora = new ClienteBitacora();
            clienteBitacora.TipoRegistroBitacora = UIHelper.GetIntFromInputCbo(this.cboTipoRegistroBitacora).Value;
            clienteBitacora.Accion = this.txtAccion.Text;
            clienteBitacora.ContactoId = currentCliente.Id;
            clienteBitacora.TipoMensajeBitacoraId = UIHelper.GetIntFromInputCbo(this.cboTipoMensajeBitacoraId);
            clienteBitacora.FechaCreacion = DateTime.Now;
            WebServiceHelper.SaveCustomerBitacora(clienteBitacora);

            currentCliente.Bitacora.Add(clienteBitacora);
        }

        protected void GridVentas_RowCommand(object sender, GridViewCommandEventArgs e)
        {
            try
            {
                if (e.CommandName == "editar")
                {
                    //    int temporadaId = Convert.ToInt32(this.GridTemporadas.DataKeys[Convert.ToInt32(e.CommandArgument)].Value);
                    //    this.Response.Redirect(string.Format("/App/TemporadaEdit.aspx?Id={0}", temporadaId), true);
                }
                else if (e.CommandName == "eliminar")
                {
                    //int temporadaId = Convert.ToInt32(this.GridTemporadas.DataKeys[Convert.ToInt32(e.CommandArgument)].Value);
                    //WebServiceHelper.EliminarTemporada(temporadaId);
                    //StoreHelper.GetObject(this.Session, MiscClass.CustomerSearchCacheKey);
                }
            }
            catch (Exception ex)
            {
                ExceptionManager.Instance.HandleException(ex);
            }
        }

        protected void GridVentas_PageIndexChanging(object sender, GridViewPageEventArgs e)
        {
            try
            {
            }
            catch (Exception ex)
            {
                ExceptionManager.Instance.HandleException(ex);
            }
        }

        protected void GridListasDistribucion_RowCommand(object sender, GridViewCommandEventArgs e)
        {
            try
            {
                if (e.CommandName == "editar")
                {
                    int listaDistribucionId = Convert.ToInt32(this.GridListasDistribucion.DataKeys[Convert.ToInt32(e.CommandArgument)].Value);
                    SetThisPageToGoBack();
                    base.NavigationContext.UrlToGoBack += string.Format("&tabName={0}", (byte)MiscClass.ClienteEditTab.ListaDistribucion);
                    this.Response.Redirect(string.Format(Request.Url.Scheme + "://" + Request.Url.Authority + MiscClass.UrlListaDeDistribucionEdit + "?Id={0}", listaDistribucionId), true);
                }
                else if (e.CommandName == "eliminar")
                {
                    int listaDistribucionId = Convert.ToInt32(this.GridListasDistribucion.DataKeys[Convert.ToInt32(e.CommandArgument)].Value);
                    WebServiceHelper.EliminarContactoDeListaDeDistribucion(listaDistribucionId, currentCliente.Id);
                    var camp = currentCliente.ListasDeDistribucion.Where(i => i.Id == listaDistribucionId).Single();
                    currentCliente.ListasDeDistribucion.Remove(camp);
                    Bind();
                }
            }
            catch (Exception ex)
            {
                ExceptionManager.Instance.HandleException(ex);
            }
        }

        protected void GridListasDistribucion_PageIndexChanging(object sender, GridViewPageEventArgs e)
        {
            try
            {
            }
            catch (Exception ex)
            {
                ExceptionManager.Instance.HandleException(ex);
            }
        }

        protected void GridListasDistribucion_RowDataBound(object sender, GridViewRowEventArgs e)
        {
            try
            {
                if (e.Row.RowType == DataControlRowType.DataRow)
                {
                    ListaDeDistribucion listaDistribucion = (ListaDeDistribucion)e.Row.DataItem;

                    e.Row.Cells[0].Attributes.Add("title", "Editar");
                    e.Row.Cells[1].Attributes.Add("title", "Eliminar");

                    ImageButton btnEditarCtrl = (ImageButton)e.Row.FindControl("btnEditar");
                    SetJavascriptForClientClickDirtyChech(btnEditarCtrl);

                    ImageButton btnEliminarCtrl = (ImageButton)e.Row.FindControl("btnEliminar");
                    SetJavascriptForDeleteRecord(btnEliminarCtrl, listaDistribucion.Nombre);

                    if (listaDistribucion.Estado.HasValue)
                    {
                        e.Row.Cells[4].Text = UIHelper.GetEnumDescription((EstadoListaDeDistribucion)listaDistribucion.Estado.Value);
                    }
                }
            }
            catch (Exception ex)
            {
                ExceptionManager.Instance.HandleException(ex);
            }
        }

        protected void GridBitacora_RowCommand(object sender, GridViewCommandEventArgs e)
        {
            try
            {
                if (e.CommandName == "editar")
                {
                    //    int temporadaId = Convert.ToInt32(this.GridTemporadas.DataKeys[Convert.ToInt32(e.CommandArgument)].Value);
                    //    this.Response.Redirect(string.Format("/App/TemporadaEdit.aspx?Id={0}", temporadaId), true);
                }
                else if (e.CommandName == "eliminar")
                {
                    //int temporadaId = Convert.ToInt32(this.GridTemporadas.DataKeys[Convert.ToInt32(e.CommandArgument)].Value);
                    //WebServiceHelper.EliminarTemporada(temporadaId);
                    //StoreHelper.GetObject(this.Session, MiscClass.CustomerSearchCacheKey);
                }
            }
            catch (Exception ex)
            {
                ExceptionManager.Instance.HandleException(ex);
            }
        }

        protected void GridBitacora_PageIndexChanging(object sender, GridViewPageEventArgs e)
        {
            try
            {
                this.GridBitacora.PageIndex = e.NewPageIndex;
                BindBitacoraToGrid();
            }
            catch (Exception ex)
            {
                ExceptionManager.Instance.HandleException(ex);
            }
        }

        private List<TipoMensajeBitacora> tipoMensajeBitacoraList;
        private List<TipoMensajeBitacora> GetTipoMensajeBitacora()
        {
            if (tipoMensajeBitacoraList == null)
            {
                tipoMensajeBitacoraList = WebServiceHelper.GetTipoMensajeBitacora(new TipoMensajeBitacoraSearch() { EmpresaId = BasePage.CompanyId, EsPdv = false });
            }

            return tipoMensajeBitacoraList;
        }

        protected void GridBitacora_RowDataBound(object sender, GridViewRowEventArgs e)
        {
            try
            {
                if (e.Row.RowType == DataControlRowType.DataRow)
                {
                    ClienteBitacora clienteBitacoraItem = (ClienteBitacora)e.Row.DataItem;
                    e.Row.Cells[1].Text = UIHelper.GetEnumDescription((TipoRegistroBitacora)clienteBitacoraItem.TipoRegistroBitacora);
                    if (clienteBitacoraItem.TipoMensajeBitacoraId.HasValue)
                    {
                        var msg = GetTipoMensajeBitacora().Where(r => r.Id == clienteBitacoraItem.TipoMensajeBitacoraId.Value).SingleOrDefault();
                        if (msg != null)
                        {
                            e.Row.Cells[2].Text = msg.Nombre;
                        }
                        else
                        {
                            e.Row.Cells[2].Text = string.Empty;
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                ExceptionManager.Instance.HandleException(ex);
            }
        }

        protected void lnkGuardar_Click(object sender, EventArgs e)
        {
            try
            {
                SaveCustomer();
                Bind();
                this.masterPage.ShowMessage(LocalizationProvider.Instance["Bo.EditContacto.ClienteGuardadoConExito"], WebMessageType.Notification);
            }
            catch (Exception ex)
            {
                ExceptionManager.Instance.HandleException(ex);
            }
        }

        protected void lnkIrPais_Click(object sender, EventArgs e)
        {
            try
            {
                if (this.cboPais.SelectedIndex >= 0)
                {
                    string paisId = this.cboPais.SelectedValue;

                    if (paisId != UIHelper.cboNullValue)
                    {
                        this.NavigationContext.RedirectTo(MiscClass.UrlPaisEdit, string.Format("?Id={0}", paisId));
                    }
                    else
                    {
                        this.NavigationContext.RedirectTo(MiscClass.UrlPaisList, string.Empty);
                    }
                }
            }
            catch (Exception ex)
            {
                ExceptionManager.Instance.HandleException(ex);
            }
        }

        protected void lnkIrATipoMensaje_Click(object sender, EventArgs e)
        {
            try
            {
                if (this.cboTipoMensajeBitacoraId.SelectedIndex >= 0)
                {
                    string tipoMensajeId = this.cboTipoMensajeBitacoraId.SelectedValue;

                    if (tipoMensajeId != UIHelper.cboNullValue)
                    {
                        this.NavigationContext.RedirectTo(MiscClass.UrlTipoMensajeBitacoraEdit, string.Format("?Id={0}", tipoMensajeId));
                    }
                    else
                    {
                        this.NavigationContext.RedirectTo(MiscClass.UrlTipoMensajeBitacoraList, string.Empty);
                    }
                }
            }
            catch (Exception ex)
            {
                ExceptionManager.Instance.HandleException(ex);
            }
        }

        protected void lnkCategoriasIrAs_Click(object sender, EventArgs e)
        {
            try
            {
                this.NavigationContext.RedirectTo(MiscClass.UrlCategoriaList, string.Empty);
            }
            catch (Exception ex)
            {
                ExceptionManager.Instance.HandleException(ex);
            }
        }

        protected void lnkGuardarBitacora_Click(object sender, EventArgs e)
        {
            try
            {
                SaveBitacoraRegistry();
                Bind();
                this.masterPage.ShowMessage(LocalizationProvider.Instance["Bo.Messages.MensajeSaveExitoso"], WebMessageType.Notification);
            }
            catch (Exception ex)
            {
                ExceptionManager.Instance.HandleException(ex);
            }
        }

        protected void lnkExportarAExcelVentas_Click(object sender, EventArgs e)
        {
            try
            {               
                LoadVentasFromContacto(this.GridCtrlVentas, currentCliente);

                HttpContext.Current.Response.Clear();
                HttpContext.Current.Response.AddHeader(
                    "content-disposition", string.Format("attachment; filename={0}", "VentasDelContacto.xls"));
                HttpContext.Current.Response.ContentType = "application/vnd.ms-excel";

                using (StringWriter sw = new StringWriter())
                {
                    using (HtmlTextWriter htw = new HtmlTextWriter(sw))
                    {
                        GridCtrlVentas.RenderCtrl(htw);

                        //  render the htmlwriter into the response
                        HttpContext.Current.Response.Write(sw.ToString());
                        HttpContext.Current.Response.End();
                    }
                }
               
            }
            catch (Exception ex)
            {
                ExceptionManager.Instance.HandleException(ex);
            }
        }

        protected void lnkExportarAExcelListaDistribucion_Click(object sender, EventArgs e)
        {
            try
            {
                bool previousAllowPaging = this.GridListasDistribucion.AllowPaging;
                this.GridListasDistribucion.AllowPaging = false;

                BindListaDeDistribucion();

                GridViewExportExcelUtil.Export("ListasDeDistribucionDeContacto.xls", this.GridListasDistribucion, 0, 1);

                this.GridListasDistribucion.AllowPaging = previousAllowPaging;
            }
            catch (Exception ex)
            {
                ExceptionManager.Instance.HandleException(ex);
            }
        }

        protected void lnkExportarAExcelBitacora_Click(object sender, EventArgs e)
        {
            try
            {
                bool previousAllowPaging = this.GridBitacora.AllowPaging;
                this.GridBitacora.AllowPaging = false;

                BindBitacoraToGrid();

                GridViewExportExcelUtil.Export("BitacoraDeContacto.xls", this.GridBitacora, 0);

                this.GridBitacora.AllowPaging = previousAllowPaging;
            }
            catch (Exception ex)
            {
                ExceptionManager.Instance.HandleException(ex);
            }
        }
    }
}